#!/bin/bash

###
# @Author: Logan.Li
# @Date: 2025-09-25 17:00:00
# @LastEditTime: 2025-09-25 17:04:46
# @Description: Kubernetes 状态检查脚本 - 用于检查系统中Kubernetes组件的安装状态
# @支持系统: RHEL/CentOS/Rocky/AlmaLinux/Amazon Linux 2/Amazon Linux 2023/Debian/Ubuntu
###
set -e

# 颜色定义
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m' # No Color

# 日志函数
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }

echo -e "${GREEN}Kubernetes 状态检查脚本${NC}"
echo "=================================="

# 检查是否为root用户
if [[ $EUID -ne 0 ]]; then
    log_error "请使用 root 用户执行此脚本"
    exit 1
fi

# 检查命令是否存在
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# 检查 Kubernetes 组件
log_info "检查 Kubernetes 组件安装状态..."
k8s_components=("kubeadm" "kubectl" "kubelet")
installed_components=()

for component in "${k8s_components[@]}"; do
    if command_exists "$component"; then
        version=$($component version --client --short 2>/dev/null || echo "未知版本")
        log_info "✓ $component 已安装: $version"
        installed_components+=("$component")
    else
        log_warn "✗ $component 未安装"
    fi
done

# 检查容器运行时
log_info "检查容器运行时..."
if command_exists containerd; then
    containerd_version=$(containerd --version 2>/dev/null | awk '{print $3}' || echo "未知版本")
    log_info "✓ containerd 已安装: $containerd_version"
    
    # 检查 containerd 服务状态
    if systemctl is-active --quiet containerd; then
        log_info "✓ containerd 服务正在运行"
    else
        log_warn "✗ containerd 服务未运行"
    fi
else
    log_warn "✗ containerd 未安装"
fi

if command_exists docker; then
    docker_version=$(docker --version 2>/dev/null | awk '{print $3}' | sed 's/,//' || echo "未知版本")
    log_info "✓ docker 已安装: $docker_version"
    
    # 检查 docker 服务状态
    if systemctl is-active --quiet docker; then
        log_info "✓ docker 服务正在运行"
    else
        log_warn "✗ docker 服务未运行"
    fi
else
    log_warn "✗ docker 未安装"
fi

# 检查集群状态（如果 kubectl 可用）
if command_exists kubectl; then
    log_info "检查 Kubernetes 集群状态..."
    
    # 检查 kubeconfig
    if [[ -f "$HOME/.kube/config" ]]; then
        log_info "✓ kubeconfig 文件存在"
        
        # 尝试连接集群
        if kubectl cluster-info >/dev/null 2>&1; then
            log_info "✓ 可以连接到 Kubernetes 集群"
            kubectl get nodes 2>/dev/null || log_warn "无法获取节点信息"
        else
            log_warn "✗ 无法连接到 Kubernetes 集群"
        fi
    else
        log_warn "✗ kubeconfig 文件不存在"
    fi
fi

# 检查系统服务
log_info "检查系统服务状态..."
services=("kubelet")

for service in "${services[@]}"; do
    if systemctl list-unit-files | grep -q "^${service}.service"; then
        if systemctl is-active --quiet "$service"; then
            log_info "✓ $service 服务正在运行"
        else
            log_warn "✗ $service 服务未运行"
            # 显示服务状态
            systemctl status "$service" --no-pager -l || true
        fi
    else
        log_warn "✗ $service 服务不存在"
    fi
done

# 检查网络配置
log_info "检查网络配置..."
if [[ -d /etc/cni/net.d ]]; then
    cni_configs=$(ls /etc/cni/net.d/*.conf 2>/dev/null | wc -l)
    if [[ $cni_configs -gt 0 ]]; then
        log_info "✓ 发现 $cni_configs 个 CNI 配置文件"
        ls -la /etc/cni/net.d/
    else
        log_warn "✗ 未发现 CNI 配置文件"
    fi
else
    log_warn "✗ CNI 配置目录不存在"
fi

# 检查防火墙和SELinux状态
log_info "检查系统配置..."

# 检查防火墙
if command_exists firewall-cmd; then
    if systemctl is-active --quiet firewalld; then
        log_warn "⚠ firewalld 正在运行，可能影响 Kubernetes 网络"
    else
        log_info "✓ firewalld 已停止"
    fi
fi

# 检查SELinux
if command_exists getenforce; then
    selinux_status=$(getenforce 2>/dev/null || echo "未知")
    if [[ "$selinux_status" == "Enforcing" ]]; then
        log_warn "⚠ SELinux 处于 Enforcing 模式，可能影响 Kubernetes"
    else
        log_info "✓ SELinux 状态: $selinux_status"
    fi
fi

# 检查swap
if [[ $(swapon --show | wc -l) -gt 0 ]]; then
    log_warn "⚠ Swap 已启用，Kubernetes 建议禁用 swap"
    swapon --show
else
    log_info "✓ Swap 已禁用"
fi

# 总结
echo
echo "=================================="
log_info "检查完成！"

if [[ ${#installed_components[@]} -gt 0 ]]; then
    log_info "已安装的 Kubernetes 组件: ${installed_components[*]}"
    log_info "如需重新安装，请使用: bash k8s.sh master force"
else
    log_info "未检测到已安装的 Kubernetes 组件"
    log_info "可以直接运行: bash k8s.sh master"
fi
